#ifndef __BASIC_THRD_H__
#define __BASIC_THRD_H__

#include <basic/list.h>

__BEGIN_DECLS

typedef void *(*THRD_FUNC_T)(void *);
#define THRD_FUNC(_func, _arg_t, _arg)   \
void *_func(_arg_t *_arg)

/*
 * 创建线程
 */
#define THRD_DETACH         0x00000001  /* 脱离父线程 */
#define THRD_16K_STACK      0x00000002  /* 堆栈KB(16) */
#define THRD_128K_STACK     0x00000004  /* 堆栈KB(128) */
#define THRD_256K_STACK     0x00000008  /* 堆栈KB(256) */
#define THRD_512K_STACK     0x00000010  /* 堆栈KB(512) */
extern int  /* 0:成功 -1:线程创建出错 */
thrd_create(
        THRD_FUNC_T func,       /* [IN] 线程函数 */
        void *arg,              /* [IN] 线程函数参数 */
        unsigned int flag,      /* [IN] 标志 */
        unsigned long *id       /* [OUT] 线程号 */
        );

/*
 * 等待线程结束
 */
extern int  /* 0:成功 -1:出错 */
thrd_join(
        unsigned long thrd_id   /* [IN] 线程号 */
        );

struct thrd_msgq;
typedef struct thrd_msgq *THRD_MSGQ;

/*
 * 创建线程消息队列
 */
extern int  /* 0:成功 */
thrd_msgq_create(
        THRD_MSGQ *msgq         /* [OUT] 消息队列 */
        );

/*
 * 撤消线程消息队列
 */
extern int  /* 0:成功 */
thrd_msgq_destroy(
        THRD_MSGQ msgq          /* [IN] 线程消息队列 */
        );

/*
 * 从线程消息队列接收消息
 */
extern int  /* 0:成功 */
thrd_msgq_recv(
        THRD_MSGQ msgq,                 /* [IN] 线程消息队列 */
        struct listp_link *list_recv,   /* [OUT] 接收队列 */
        int timeout_ms                  /* [IN] 超时(毫秒) */
        );

/*
 * 发送消息到线程队列
 */
extern int  /* 0:成功 */
thrd_msgq_send(
        THRD_MSGQ msgq,                 /* [IN] 线程消息队列 */
        struct listp_link *list_send    /* [IN] 发送节点 */
        );

/*
 * 线程队列中消息数量
 */
extern int
thrd_msgq_count(
        THRD_MSGQ msgq          /* [IN] 线程消息队列 */
        );

__END_DECLS

#endif
